/* 
中间件函数  用于具体路由处理前 根据需求来对请求进行特定处理
接收三个参数 req(请求对象)  res(响应对象)  next(请求向后跳转)

类型: 内置 自定义 第三方
*/

// 引入express
const express = require('express')
const fs = require('fs')

// 引入第三方中间件
// const bodyParser = require('body-parser')

const app = express()


// 内置的中间件 配置静态页面
// app.use(express.static('public'))

// 自定义中间件 (柯里化函数 把三个参数 分成两次处理)
// 用来部署中间件资源   配置静态页面
function myStatic (dir) {
  console.log('外部');
  return (req, res, next) => {
    console.log('myStatic');
    // 得到资源的path
    let path = req.path
    //如果是根路径 修正为 /index.html
    if (path === '/') path = '/index.html'

    // 得到资源的绝对路径
    const filePath = __dirname + '/' + dir + path

    // 读取资源文件
    fs.readFile(filePath, (error, data) => {
      if (error) next() // 如果找不到该路径 那么向后跳转
      else res.end(data) // 这里用end原因 : data是buffer对象 如果用send 会下载
    })
  }
}
app.use(myStatic('public'))


// 使用第三方中间件  解析请求体参数, 并保存到req.body上  作用 解析body参数
// https://blog.csdn.net/maodun_2013/article/details/91383494
// app.use(bodyParser.urlencoded({extended: false}))
// app.use(bodyParser.json())


// 内置中间件 作用 解析body参数
app.use(express.urlencoded({extended: false}))
app.use(express.json())



// 注册路由

// get请求
app.get('/middleware', (req, res) => {
  res.send('自定义中间件  middleware')
})


// post请求
app.post('/middleware', (req, res) => {
  const { b, c } = req.body
  console.log('请求体参数', b, c)
  res.send('post middleware response')
})



app.listen('8801', () => {
  console.log('服务已启动: http://localhost:8801')
})